//
//  NSDate+Nomal.h
//  CXDToolKit
//
//  Created by 陈小东 on 15/3/4.
//  Copyright (c) 2015年 ___cxd___. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NSDate (Nomal)
/**
 * 时间间隔几个月的时间
 * @param date 开始时间
 * @param month 间隔月数，正数是date之后的时间，负数是date之前的时间
 * @return 计算后的时间
 */
+ (NSDate *)dateWithIntervalMonthFromDate:(NSDate *)date intervalMonth:(NSInteger)month;
/**
 * 时间间隔几个月的时间
 * @param month 间隔月数，正数是之后的时间，负数是之前的时间
 * @return 计算后的时间
 */
- (NSDate *)dateWithIntervalMonth:(NSInteger)month;

/**
 * 间隔几天的时间
 * @param data 开始时间
 * @param day 间隔天数  正数是之后的时间，负数是之前的时间
 * @return 计算的时间
 */
+ (NSDate *)dateWithIntervalDayFromDate:(NSDate *)date intervalDay:(NSInteger)day;
/**
 * 间隔几天的时间
 * @param day 间隔天数  正数是之后的时间，负数是之前的时间
 * @return 计算的时间
 */
- (NSDate *)dateWithIntervalDay:(NSInteger)day;


#pragma mark - Relative dates from the current date
/**
 * 得到明天的时间
 *
 * @return 明天的时间
 */
+ (NSDate *)dateTomorrow;
/**
 * 得到昨天的时间
 *
 * @return 昨天的时间
 */
+ (NSDate *)dateYesterday;

/**
 * 当前时间之后几天的一个时间
 * @param dDays 间隔的天数
 * @return 得到的时间
 */
+ (NSDate *)dateWithDaysFromNow:(NSInteger) dDays;

/**
 * 当前时间之前几天的一个时间
 * @param dDays 间隔的天数
 * @return 得到的时间
 */
+ (NSDate *)dateWithDaysBeforeNow:(NSInteger) dDays;

/**
 * 当前时间之后几个小时的时间
 * @param dHours 间隔小时数
 * @return 得到的时间
 */
+ (NSDate *)dateWithHoursFromNow:(NSInteger) dHours;
/**
 * 当前时间之前几个小时的时间
 * @param dHours 间隔小时数
 * @return 得到的时间
 */
+ (NSDate *)dateWithHoursBeforeNow:(NSInteger) dHours;

/**
 * 当前时间之前的几分钟的时间
 * @param dMinutes 间隔的分钟数
 * @return 得到的时间
 */
+ (NSDate *)dateWithMinutesFromNow:(NSInteger) dMinutes;
/**
 * 当前时间之后的几分钟的时间
 * @param dMinutes 间隔的分钟数
 * @return 得到的时间
 */
+ (NSDate *)dateWithMinutesBeforeNow:(NSInteger) dMinutes;

#pragma mark - Comparing dates
/**
 * 是否是同一天，年月日相同
 * @param otherDate 另外要比较的时间
 * @return YES 是，NO 否
 */
- (BOOL)isEqualToDateIgnoringTime:(NSDate *) otherDate;
/**
 * 是否今天
 *
 * @return YES 是，NO 否
 */
- (BOOL)isToday;
/**
 * 是否明天
 *
 * @return YES 是，NO 否
 */
- (BOOL)isTomorrow;
/**
 * 是否昨天
 *
 * @return YES 是，NO 否
 */
- (BOOL)isYesterday;
/**
 * 是否在同一周
 * @param otherDate 另外要比较的时间
 * @return YES 是，NO 否
 */
- (BOOL)isSameWeekAsDate:(NSDate *) aDate;
/**
 * 是否在本周
 *
 * @return YES 是，NO 否
 */
- (BOOL)isThisWeek;
/**
 * 是否在下一周
 *
 * @return YES 是，NO 否
 */
- (BOOL)isNextWeek;
/**
 * 是否是最后一周
 *
 * @return YES 是，NO 否
 */
- (BOOL)isLastWeek;
/**
 * 是否是同一个月，月相同
 * @param aDate 要比较的时间
 * @return YES 是，NO 否
 */
- (BOOL)isSameMonthAsDate:(NSDate *) aDate;
/**
 * 是否是本月
 *
 * @return YES 是，NO 否
 */
- (BOOL)isThisMonth;
/**
 * 是否是同一年
 * @param aDate 要比较的时间
 * @return YES 是，NO 否
 */
- (BOOL)isSameYearAsDate:(NSDate *) aDate;
/**
 * 是否是当前的年
 *
 * @return YES 是，NO 否
 */
- (BOOL)isThisYear;
/**
 * 是否是下一年
 *
 * @return YES 是，NO 否
 */
- (BOOL)isNextYear;
/**
 * 是否是上一年
 *
 * @return YES 是，NO 否
 */
- (BOOL)isLastYear;

/**
 * 是否比这个时间早
 * @param aDate 要比较的时间
 * @return YES 是，NO 否
 */
- (BOOL)isEarlierThanDate:(NSDate *) aDate;
/**
 * 是否比这个时间晚
 * @param aDate 要比较的时间
 * @return YES 是，NO 否
 */
- (BOOL)isLaterThanDate:(NSDate *) aDate;
/**
 * 是否比这个时间早或者相同
 * @param aDate 要比较的时间
 * @return YES 是，NO 否
 */
- (BOOL)isEarlierThanOrEqualDate:(NSDate *) aDate;
/**
 * 是否比这个时间晚或者相同
 * @param aDate 要比较的时间
 * @return YES 是，NO 否
 */
- (BOOL)isLaterThanOrEqualDate:(NSDate *) aDate;
/**
 * 是否是未来的时间
 *
 * @return YES 是，NO 否
 */
- (BOOL)isInFuture;
/**
 * 是否是过去的时间
 *
 * @return YES 是，NO 否
 */
- (BOOL)isInPast;

#pragma mark - Date roles
/**
 * 是否是工作时间(周一至周五)
 *
 * @return YES 是，NO 否
 */
- (BOOL)isTypicallyWorkday;
/**
 * 是否是周末时间（周六\周日）
 *
 * @return YES 是，NO 否
 */
- (BOOL)isTypicallyWeekend;

#pragma mark - Adjusting dates
- (NSDate *)dateByAddingYears:(NSInteger) dYears;

- (NSDate *)dateBySubtractingYears:(NSInteger) dYears;

- (NSDate *)dateByAddingMonths:(NSInteger) dMonths;

- (NSDate *)dateBySubtractingMonths:(NSInteger) dMonths;

- (NSDate *)dateByAddingDays:(NSInteger) dDays;

- (NSDate *)dateBySubtractingDays:(NSInteger) dDays;

- (NSDate *)dateByAddingHours:(NSInteger) dHours;

- (NSDate *)dateBySubtractingHours:(NSInteger) dHours;

- (NSDate *)dateByAddingMinutes:(NSInteger) dMinutes;

- (NSDate *)dateBySubtractingMinutes:(NSInteger) dMinutes;

- (NSDate *)dateAtStartOfDay;

- (NSDate *)dateAtEndOfDay;

- (NSDate *)dateAtStartOfWeek;

- (NSDate *)dateAtEndOfWeek;

- (NSDate *)dateAtStartOfMonth;

- (NSDate *)dateAtEndOfMonth;

- (NSDate *)dateAtStartOfYear;

- (NSDate *)dateAtEndOfYear;

#pragma mark - Retrieving intervals

- (NSInteger)minutesAfterDate:(NSDate *) aDate;

- (NSInteger)minutesBeforeDate:(NSDate *) aDate;

- (NSInteger)hoursAfterDate:(NSDate *) aDate;

- (NSInteger)hoursBeforeDate:(NSDate *) aDate;

- (NSInteger)daysAfterDate:(NSDate *) aDate;

- (NSInteger)daysBeforeDate:(NSDate *) aDate;

- (NSInteger)monthsAfterDate:(NSDate *) aDate;

- (NSInteger)monthsBeforeDate:(NSDate *) aDate;

/**
 * 两个时间间隔的天数
 * @param aDate 要比较的时间
 * @return 天数
 */
- (NSInteger)distanceInDaysToDate:(NSDate *) aDate;

#pragma mark - Decomposing dates
/**
 * return nearest hour
 */
@property(readonly) NSInteger nearestHour;
@property(readonly) NSInteger hour;
@property(readonly) NSInteger minute;
@property(readonly) NSInteger seconds;
@property(readonly) NSInteger day;
@property(readonly) NSInteger month;
@property(readonly) NSInteger weekOfYear;
@property(readonly) NSInteger weekOfMonth;
//  in the Gregorian calendar, n is 7 and Sunday is represented by 1.
@property(readonly) NSInteger weekday;
@property(readonly) NSInteger firstDayOfWeekday;
@property(readonly) NSInteger lastDayOfWeekday;
// e.g. 2nd Tuesday of the month == 2
@property(readonly) NSInteger nthWeekday;
@property(readonly) NSInteger year;
@property(readonly) NSInteger gregorianYear;
@end

@interface NSDate (Formatter)
/**
 *  格式化时间 规则：
 *  <1分钟: @"刚刚"
 *  >1分钟 & <60分: @"xx秒前"
 *  >60分钟 & <24小时: @"xx小时前"
 *  >24小时 & <7天: @"xx天前"
 *  >7小时 & <30天: @"xx周前"
 *  >30天 @"yyyy年MM月dd日 HH:mm"
 *  @return 时间的string
 */
- (NSString *)formatterModel1;


/**
 *  格式化时间 规则：
 *  <1分钟: @"刚刚"
 *  >1分钟 & <60分: @"xx秒前"
 *  >60分钟 & <24小时: @"xx小时前"
 *  >24小时 & <7天: @"xx天前"
 *  >7小时 & <30天: @"xx周前"
 *  >30天 & <24个月: @"xx月前"
 *  >24个月:  @"xx年前"
 *  @return 时间的string
 */
- (NSString *)formatterModel2;

-(NSString *)formatterModel3;
-(NSString *)formatterModel4;
/**
 *最近三天显示今天，昨天，之前的如果是今年的则显示日期，如果是去年的则显示年份
 */
-(NSString *)formatterModel5;
-(NSString *)formatterModel6;
@end
